// Use data from mapdata.js with fallback const { branchData, regionData, svgRegionMapping, mapConfig } = window.MapData || { branchData: { surabaya: { title: "Cabang Surabaya", address: "Jl. Tunjungan No. 45, Surabaya 60275", phone: "031-9876543", email: "surabaya@ptlenko.com", hours: "Senin - Jumat: 08:00 - 17:00, Sabtu: 08:00 - 12:00", region: "java" }, medan: { title: "Cabang Medan", address: "Jl. Gatot Subroto No. 78, Medan 20112", phone: "061-1122334", email: "medan@ptlenko.com", hours: "Senin - Jumat: 08:00 - 17:00, Sabtu: 08:00 - 12:00", region: "sumatra" }, makassar: { title: "Cabang Makassar", address: "Jl. Veteran Selatan No. 12, Makassar 90231", phone: "0411-9988776", email: "makassar@ptlenko.com", hours: "Senin - Jumat: 08:00 - 17:00, Sabtu: 08:00 - 12:00", region: "sulawesi" } }, regionData: { sumatra: { title: "Sumatra", description: "Pulau terbesar keenam di dunia dengan kekayaan alam yang melimpah", branches: ["medan"], status: "active" }, java: { title: "Jawa", description: "Pulau terpadat di Indonesia dengan pusat pemerintahan dan ekonomi", branches: ["surabaya"], status: "active" }, kalimantan: { title: "Kalimantan", description: "Pulau terbesar ketiga di dunia dengan hutan tropis yang luas", branches: [], status: "coming-soon" }, sulawesi: { title: "Sulawesi", description: "Pulau dengan bentuk unik dan keanekaragaman hayati yang tinggi", branches: ["makassar"], status: "active" }, papua: { title: "Papua", description: "Pulau terbesar kedua di dunia dengan keanekaragaman budaya yang kaya", branches: [], status: "coming-soon" } }, svgRegionMapping: {}, mapConfig: { viewBox: "0 0 1000 600", width: "100%", height: "100%", defaultFill: "#e8f4fd", defaultStroke: "#1e40af", defaultStrokeWidth: "2", hoverFill: "#dc2626", hoverStroke: "#ef4444", hoverStrokeWidth: "3" } }; // DOM Elements const hamburger = document.querySelector('.hamburger'); const navMenu = document.querySelector('.nav-menu'); const scrollToTopBtn = document.querySelector('.scroll-to-top'); // Mobile navigation toggle if (hamburger && navMenu) { hamburger.addEventListener('click', () => { const isActive = hamburger.classList.contains('active'); hamburger.classList.toggle('active'); navMenu.classList.toggle('active'); // Update ARIA attributes for accessibility hamburger.setAttribute('aria-expanded', !isActive); navMenu.setAttribute('aria-hidden', isActive); }); // Close mobile menu when clicking on a link document.querySelectorAll('.nav-link').forEach(n => n.addEventListener('click', () => { hamburger.classList.remove('active'); navMenu.classList.remove('active'); hamburger.setAttribute('aria-expanded', 'false'); navMenu.setAttribute('aria-hidden', 'true'); })); // Close mobile menu when clicking outside document.addEventListener('click', (e) => { if (!hamburger.contains(e.target) && !navMenu.contains(e.target)) { hamburger.classList.remove('active'); navMenu.classList.remove('active'); } }); } // Smooth scrolling for navigation links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); // Scroll to top functionality if (scrollToTopBtn) { window.addEventListener('scroll', () => { if (window.pageYOffset > 300) { scrollToTopBtn.classList.add('visible'); } else { scrollToTopBtn.classList.remove('visible'); } }); scrollToTopBtn.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); } // SVG Map functionality const branchPopup = document.getElementById('branchPopup'); const popupTitle = document.getElementById('popupTitle'); const popupAddress = document.getElementById('popupAddress'); const popupPhone = document.getElementById('popupPhone'); const popupEmail = document.getElementById('popupEmail'); const popupHours = document.getElementById('popupHours'); const popupClose = document.querySelector('.popup-close'); // Initialize interactive map function initInteractiveMap() { console.log('initInteractiveMap called'); // Check if required elements exist const container = document.querySelector('.svg-container'); const loader = document.getElementById('mapLoader'); console.log('Container found:', !!container); console.log('Loader found:', !!loader); if (!container) { console.error('Container not found'); return; } // For now, directly load fallback map to ensure it works console.log('Loading fallback map directly'); loadFallbackMap(); // Try to load external SVG in background loadExternalSVG().then(() => { console.log('External SVG loaded successfully, replacing fallback'); // Replace fallback with external SVG if successful const container = document.querySelector('.svg-container'); const existingSvg = container.querySelector('.map-svg'); if (existingSvg) { container.removeChild(existingSvg); } }).catch((error) => { console.log('External SVG failed, keeping fallback:', error); }); } // Load external SVG file using SVGInteractiveHandler async function loadExternalSVG() { try { console.log('Loading external SVG...'); const response = await fetch('id.svg'); if (!response.ok) { throw new Error(`Failed to load SVG: ${response.status} ${response.statusText}`); } const svgText = await response.text(); console.log('SVG loaded, parsing...'); // Use SVGInteractiveHandler to make SVG interactive const svgHandler = new SVGInteractiveHandler(); const svgElement = svgHandler.init(svgText, regionData, branchData); if (svgElement) { console.log('SVG parsed and made interactive successfully'); // Add SVG to container const container = document.querySelector('.svg-container'); if (container) { container.appendChild(svgElement); console.log('Interactive SVG added to container'); return Promise.resolve(); } else { throw new Error('Container not found'); } } else { throw new Error('Failed to create interactive SVG'); } } catch (error) { console.error('Error loading SVG:', error); // Fallback to simple map loadFallbackMap(); return Promise.reject(error); } } // Add interactive regions to SVG using mapdata function addInteractiveRegionsFromMapData(svgElement) { // Find all path elements and add region classes const paths = svgElement.querySelectorAll('path'); // Try to match paths by ID first, then by position paths.forEach((path, index) => { const pathId = path.getAttribute('id'); let regionName = null; // Check if path ID matches any in svgRegionMapping if (pathId && svgRegionMapping[pathId]) { regionName = svgRegionMapping[pathId]; } else { // Fallback to position-based mapping const regionNames = ['sumatra', 'java', 'kalimantan', 'sulawesi', 'papua']; regionName = regionNames[index]; } if (regionName && regionData[regionName]) { const region = regionData[regionName]; path.setAttribute('class', 'region'); path.setAttribute('data-region', regionName); path.setAttribute('fill', mapConfig.defaultFill); path.setAttribute('stroke', mapConfig.defaultStroke); path.setAttribute('stroke-width', mapConfig.defaultStrokeWidth); // Add title for accessibility path.setAttribute('title', region.title); } }); } // Legacy function for backward compatibility function addInteractiveRegions(svgElement) { addInteractiveRegionsFromMapData(svgElement); } // Fallback map if external SVG fails function loadFallbackMap() { console.log('Loading fallback map...'); const container = document.querySelector('.svg-container'); const loader = document.getElementById('mapLoader'); if (!container) { console.error('Container not found for fallback'); return; } // Remove loader if it exists if (loader && loader.parentNode) { container.removeChild(loader); console.log('Loader removed'); } // Create fallback SVG using mapConfig // const fallbackSVG = document.createElement('div'); // fallbackSVG.innerHTML = ` // // // // // // // // // // // // // // // // `; // // const svgElement = fallbackSVG.firstElementChild; // container.appendChild(svgElement); console.log('Fallback map added to container'); // Initialize interactions setTimeout(() => { initRegionInteractions(); console.log('Region interactions initialized'); }, 100); } function initRegionInteractions() { // Get regions from SVG const regions = document.querySelectorAll('.region'); regions.forEach((region, index) => { const regionName = region.getAttribute('data-region'); if (regionName) { region.addEventListener('mouseenter', (e) => { showRegionPopup(regionName, region); }); region.addEventListener('mouseleave', () => { hideBranchPopup(); }); region.addEventListener('click', (e) => { e.preventDefault(); showRegionPopup(regionName, region); }); } }); // Close popup when clicking close button if (popupClose) { popupClose.addEventListener('click', hideBranchPopup); } // Close popup when clicking outside document.addEventListener('click', (e) => { if (!branchPopup.contains(e.target) && !e.target.closest('.region')) { hideBranchPopup(); } }); } function showRegionPopup(regionName, region) { const regionInfo = regionData[regionName]; if (!regionInfo) return; // Update popup content based on region popupTitle.textContent = regionInfo.title; if (regionInfo.branches.length > 0) { // Show branch information if available const branch = branchData[regionInfo.branches[0]]; popupAddress.textContent = branch.address; popupPhone.textContent = branch.phone; popupEmail.textContent = branch.email; popupHours.textContent = branch.hours; // Add additional info if available if (branch.description) { popupAddress.innerHTML = `${branch.address}
${branch.description}`; } } else { // Show region information for areas without branches popupAddress.innerHTML = ` ${regionInfo.title}
${regionInfo.description}

Populasi: ${regionInfo.population}
Luas: ${regionInfo.area}
Status: ${regionInfo.status === 'coming-soon' ? 'Segera Hadir' : 'Aktif'} `; popupPhone.textContent = "Segera hadir"; popupEmail.textContent = "info@ptlenko.com"; popupHours.textContent = "Dalam pengembangan"; } // Position popup near the region const rect = region.getBoundingClientRect(); const mapRect = document.querySelector('.indonesia-map').getBoundingClientRect(); let left = rect.left + rect.width / 2 - 150; // Center horizontally let top = rect.top - 200; // Position above the region // Adjust if popup would go off screen if (left < 20) left = 20; if (left > window.innerWidth - 320) left = window.innerWidth - 320; if (top < 20) top = rect.bottom + 10; // Position below if no space above branchPopup.style.left = left + 'px'; branchPopup.style.top = top + 'px'; branchPopup.classList.add('active'); } function showBranchPopup(branchId, hotspot) { const branch = branchData[branchId]; if (!branch) return; // Update popup content popupTitle.textContent = branch.title; popupAddress.textContent = branch.address; popupPhone.textContent = branch.phone; popupEmail.textContent = branch.email; popupHours.textContent = branch.hours; // Position popup near the hotspot const rect = hotspot.getBoundingClientRect(); const mapRect = document.querySelector('.indonesia-map').getBoundingClientRect(); let left = rect.left + rect.width / 2 - 150; // Center horizontally let top = rect.top - 200; // Position above the hotspot // Adjust if popup would go off screen if (left < 20) left = 20; if (left > window.innerWidth - 320) left = window.innerWidth - 320; if (top < 20) top = rect.bottom + 10; // Position below if no space above branchPopup.style.left = left + 'px'; branchPopup.style.top = top + 'px'; branchPopup.classList.add('active'); } function hideBranchPopup() { branchPopup.classList.remove('active'); branchPopup.setAttribute('aria-hidden', 'true'); } // Initialize map when DOM is loaded document.addEventListener('DOMContentLoaded', () => { console.log('DOM loaded, initializing map...'); console.log('MapData available:', !!window.MapData); console.log('Branch data:', branchData); console.log('Region data:', regionData); // Add a small delay to ensure all elements are ready setTimeout(() => { initInteractiveMap(); }, 100); }); // Also try to initialize after a short delay as backup setTimeout(() => { const loader = document.getElementById('mapLoader'); if (loader && loader.parentNode) { console.log('Backup initialization triggered'); loadFallbackMap(); } }, 2000); // Form validation function validateForm(formId) { const form = document.getElementById(formId); if (!form) return false; const inputs = form.querySelectorAll('input[required], textarea[required]'); let isValid = true; inputs.forEach(input => { if (!input.value.trim()) { input.classList.add('error'); isValid = false; } else { input.classList.remove('error'); } }); return isValid; } // Contact form submission with accessibility const contactForm = document.getElementById('contactForm'); if (contactForm) { contactForm.addEventListener('submit', (e) => { e.preventDefault(); // Clear previous errors clearFormErrors(); if (validateFormWithAccessibility('contactForm')) { // Show success message alert('Terima kasih! Pesan Anda telah dikirim. Kami akan menghubungi Anda segera.'); contactForm.reset(); } }); } // Enhanced form validation with accessibility function validateFormWithAccessibility(formId) { const form = document.getElementById(formId); const requiredFields = form.querySelectorAll('[required]'); let isValid = true; requiredFields.forEach(field => { const fieldName = field.name; const fieldValue = field.value.trim(); // Clear previous error clearFieldError(fieldName); if (!fieldValue) { showFieldError(fieldName, 'Field ini wajib diisi'); isValid = false; } else if (field.type === 'email' && !isValidEmail(fieldValue)) { showFieldError(fieldName, 'Mohon masukkan alamat email yang valid'); isValid = false; } }); if (!isValid) { // Focus on first error field const firstError = form.querySelector('.error-message.show'); if (firstError) { const field = firstError.previousElementSibling; field.focus(); } } return isValid; } function showFieldError(fieldName, message) { const field = document.getElementById(fieldName); const errorElement = document.getElementById(fieldName + '-error'); if (errorElement) { errorElement.textContent = message; errorElement.classList.add('show'); } field.setAttribute('aria-invalid', 'true'); } function clearFieldError(fieldName) { const errorElement = document.getElementById(fieldName + '-error'); if (errorElement) { errorElement.textContent = ''; errorElement.classList.remove('show'); } const field = document.getElementById(fieldName); field.setAttribute('aria-invalid', 'false'); } function clearFormErrors() { const errorElements = document.querySelectorAll('.error-message'); errorElements.forEach(error => { error.textContent = ''; error.classList.remove('show'); }); const fields = document.querySelectorAll('input, select, textarea'); fields.forEach(field => { field.setAttribute('aria-invalid', 'false'); }); } // Newsletter subscription const newsletterForm = document.getElementById('newsletterForm'); if (newsletterForm) { newsletterForm.addEventListener('submit', (e) => { e.preventDefault(); const email = newsletterForm.querySelector('input[type="email"]').value; if (email) { alert('Terima kasih! Anda telah berhasil berlangganan newsletter kami.'); newsletterForm.reset(); } }); } // Animation on scroll const observerOptions = { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }; const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.style.opacity = '1'; entry.target.style.transform = 'translateY(0)'; } }); }, observerOptions); // Observe elements for animation document.addEventListener('DOMContentLoaded', () => { const animatedElements = document.querySelectorAll('.about-content, .news-card, .contact-content'); animatedElements.forEach(el => { el.style.opacity = '0'; el.style.transform = 'translateY(30px)'; el.style.transition = 'opacity 0.6s ease, transform 0.6s ease'; observer.observe(el); }); }); // ============================================ // News Data and Functions // ============================================ // News data //const newsData = [ // { // id: 1, // title: "PT Lenko Surya Perkasa Membuka Cabang Baru di Makassar", // slug: "pt-lenko-surya-perkasa-membuka-cabang-baru-di-makassar", // excerpt: "PT Lenko Surya Perkasa dengan bangga mengumumkan pembukaan cabang baru di Makassar untuk memperluas jangkauan distribusi produk farmasi di wilayah Indonesia Timur.", // content: "PT Lenko Surya Perkasa, distributor utama produk farmasi terkemuka di Indonesia, dengan bangga mengumumkan pembukaan cabang baru di Makassar, Sulawesi Selatan. Cabang baru ini merupakan langkah strategis untuk memperluas jangkauan distribusi produk farmasi berkualitas tinggi ke seluruh wilayah Indonesia Timur.\n\nCabang Makassar berlokasi di Jl. Veteran Selatan No. 12, Makassar 90231, dan dilengkapi dengan fasilitas gudang modern dengan sistem penyimpanan yang memenuhi standar Good Distribution Practice (GDP). Cabang ini akan melayani kebutuhan distribusi produk farmasi untuk rumah sakit, apotek, dan klinik di seluruh Sulawesi.\n\nDengan pembukaan cabang ini, PT Lenko Surya Perkasa kini memiliki tiga cabang strategis di Indonesia: Surabaya (Jawa Timur), Medan (Sumatra Utara), dan Makassar (Sulawesi Selatan).", // category: "Perusahaan", // date: "2024-01-15", // author: "Admin PT Lenko", // image: "lenko.png" // }, // { // id: 2, // title: "Inovasi Sistem Distribusi Digital untuk Efisiensi Lebih Baik", // slug: "inovasi-sistem-distribusi-digital-untuk-efisiensi-lebih-baik", // excerpt: "PT Lenko Surya Perkasa meluncurkan sistem distribusi digital terbaru yang memungkinkan pelanggan untuk memesan produk secara online dengan lebih mudah dan efisien.", // content: "PT Lenko Surya Perkasa terus berinovasi dalam meningkatkan kualitas layanan distribusi produk farmasi. Kali ini, perusahaan meluncurkan sistem distribusi digital terbaru yang dirancang untuk memberikan pengalaman yang lebih baik bagi pelanggan.\n\nSistem baru ini memungkinkan rumah sakit, apotek, dan klinik untuk memesan produk farmasi secara online melalui platform digital yang user-friendly. Fitur-fitur utama dari sistem ini meliputi:\n\n1. Pemesanan Online Real-time: Pelanggan dapat melihat ketersediaan stok produk secara real-time dan melakukan pemesanan dengan mudah.\n\n2. Tracking Pengiriman: Sistem pelacakan yang memungkinkan pelanggan untuk memantau status pengiriman produk mereka.\n\n3. Manajemen Inventori: Dashboard yang membantu pelanggan mengelola inventori mereka dengan lebih efisien.\n\n4. Laporan Otomatis: Generasi laporan penjualan dan pembelian secara otomatis untuk analisis yang lebih baik.\n\nSistem ini telah diuji coba di cabang Surabaya dan akan segera diterapkan di semua cabang PT Lenko Surya Perkasa.", // category: "Teknologi", // date: "2024-01-10", // author: "Tim IT PT Lenko", // image: "lenko.png" // }, // { // id: 3, // title: "Kerjasama dengan Produsen Farmasi Internasional", // slug: "kerjasama-dengan-produsen-farmasi-internasional", // excerpt: "PT Lenko Surya Perkasa menandatangani perjanjian kerjasama dengan produsen farmasi internasional terkemuka untuk mendistribusikan produk-produk berkualitas tinggi di Indonesia.", // content: "PT Lenko Surya Perkasa dengan bangga mengumumkan penandatanganan perjanjian kerjasama strategis dengan beberapa produsen farmasi internasional terkemuka. Kerjasama ini bertujuan untuk memperluas portofolio produk farmasi berkualitas tinggi yang didistribusikan di Indonesia.\n\nMelalui kerjasama ini, PT Lenko Surya Perkasa akan menjadi distributor eksklusif untuk berbagai produk farmasi inovatif yang telah terbukti efektif dan aman digunakan. Produk-produk ini mencakup:\n\n- Obat-obatan generik berkualitas tinggi\n- Suplemen dan vitamin premium\n- Produk kesehatan khusus\n- Alat kesehatan medis\n\nKerjasama ini tidak hanya memperkuat posisi PT Lenko Surya Perkasa sebagai distributor utama di Indonesia, tetapi juga memberikan akses yang lebih luas bagi masyarakat Indonesia terhadap produk-produk farmasi berkualitas internasional dengan harga yang kompetitif.\n\nDirektur Utama PT Lenko Surya Perkasa menyatakan bahwa kerjasama ini merupakan bagian dari komitmen perusahaan untuk terus memberikan nilai terbaik bagi pelanggan dan berkontribusi pada peningkatan kualitas layanan kesehatan di Indonesia.", // category: "Kerjasama", // date: "2024-01-05", // author: "Tim Corporate PT Lenko", // image: "lenko.png" // }, // { // id: 4, // title: "Pelatihan Good Distribution Practice untuk Tim Distribusi", // slug: "pelatihan-good-distribution-practice-untuk-tim-distribusi", // excerpt: "PT Lenko Surya Perkasa menyelenggarakan pelatihan Good Distribution Practice (GDP) untuk seluruh tim distribusi guna memastikan standar kualitas tertinggi dalam distribusi produk farmasi.", // content: "Sebagai komitmen terhadap kualitas dan keamanan produk farmasi, PT Lenko Surya Perkasa menyelenggarakan pelatihan Good Distribution Practice (GDP) untuk seluruh tim distribusi dari semua cabang.\n\nPelatihan ini diikuti oleh lebih dari 100 karyawan yang terlibat dalam proses distribusi, mulai dari tim gudang, logistik, hingga sales representative. Materi pelatihan mencakup:\n\n1. Prinsip-prinsip Good Distribution Practice (GDP)\n2. Manajemen suhu dan penyimpanan produk farmasi\n3. Prosedur penanganan produk yang benar\n4. Dokumentasi dan pelacakan produk\n5. Penanganan produk yang rusak atau kadaluarsa\n6. Keamanan dan kontrol kualitas\n\nPelatihan ini dipandu oleh instruktur bersertifikat dan diselenggarakan selama 3 hari dengan kombinasi teori dan praktik. Setelah pelatihan, seluruh peserta akan mengikuti ujian untuk mendapatkan sertifikat GDP.\n\nDirektur Operasional PT Lenko Surya Perkasa menekankan pentingnya pelatihan ini untuk memastikan bahwa setiap produk farmasi yang didistribusikan memenuhi standar kualitas dan keamanan tertinggi, sehingga dapat memberikan manfaat optimal bagi pasien.", // category: "Pelatihan", // date: "2023-12-28", // author: "Tim HR PT Lenko", // image: "lenko.png" // }, // { // id: 5, // title: "Program CSR: Donasi Produk Farmasi untuk Daerah Terpencil", // slug: "program-csr-donasi-produk-farmasi-untuk-daerah-terpencil", // excerpt: "PT Lenko Surya Perkasa meluncurkan program Corporate Social Responsibility (CSR) dengan memberikan donasi produk farmasi untuk daerah-daerah terpencil di Indonesia.", // content: "Sebagai bentuk tanggung jawab sosial perusahaan, PT Lenko Surya Perkasa meluncurkan program Corporate Social Responsibility (CSR) yang berfokus pada peningkatan akses kesehatan di daerah-daerah terpencil di Indonesia.\n\nProgram ini dimulai dengan donasi produk farmasi esensial ke beberapa puskesmas dan klinik di daerah terpencil di Sulawesi dan Kalimantan. Produk-produk yang didonasikan meliputi:\n\n- Obat-obatan dasar\n- Vitamin dan suplemen\n- Alat kesehatan sederhana\n- Produk perawatan kesehatan\n\nSelain donasi produk, PT Lenko Surya Perkasa juga mengirimkan tim medis untuk memberikan edukasi kesehatan kepada masyarakat di daerah tersebut. Program edukasi mencakup:\n\n1. Penggunaan obat yang benar dan aman\n2. Pencegahan penyakit menular\n3. Pola hidup sehat\n4. Manajemen kesehatan keluarga\n\nProgram CSR ini merupakan komitmen jangka panjang PT Lenko Surya Perkasa untuk berkontribusi pada peningkatan kualitas hidup masyarakat Indonesia, khususnya di daerah-daerah yang memiliki akses terbatas terhadap layanan kesehatan.\n\nDirektur Utama menyatakan bahwa program ini akan terus berlanjut dan diperluas ke lebih banyak daerah di masa depan.", // category: "CSR", // date: "2023-12-20", // author: "Tim CSR PT Lenko", // image: "lenko.png" // }, // { // id: 6, // title: "Peningkatan Kapasitas Gudang di Cabang Surabaya", // slug: "peningkatan-kapasitas-gudang-di-cabang-surabaya", // excerpt: "PT Lenko Surya Perkasa melakukan ekspansi gudang di cabang Surabaya untuk meningkatkan kapasitas penyimpanan dan efisiensi distribusi produk farmasi.", // content: "Untuk memenuhi permintaan yang terus meningkat, PT Lenko Surya Perkasa melakukan ekspansi gudang di cabang Surabaya. Ekspansi ini meningkatkan kapasitas penyimpanan hingga 50% dan dilengkapi dengan teknologi terbaru untuk memastikan kualitas produk.\n\nGudang baru ini dilengkapi dengan:\n\n1. Sistem pendingin otomatis untuk produk yang memerlukan suhu terkontrol\n2. Sistem manajemen inventori berbasis teknologi RFID\n3. Area penyimpanan khusus untuk produk berbahaya\n4. Sistem keamanan tingkat tinggi\n5. Sistem pemantauan suhu dan kelembaban real-time\n\nEkspansi ini memungkinkan PT Lenko Surya Perkasa untuk menyimpan lebih banyak variasi produk dan melayani lebih banyak pelanggan dengan efisiensi yang lebih tinggi. Gudang baru juga dirancang dengan mempertimbangkan aspek keberlanjutan lingkungan dengan penggunaan energi yang lebih efisien.\n\nProyek ekspansi ini memakan waktu 6 bulan dan telah selesai pada akhir tahun 2023. Dengan kapasitas yang lebih besar, cabang Surabaya kini dapat melayani kebutuhan distribusi untuk seluruh wilayah Jawa Timur dan sekitarnya dengan lebih baik.", // category: "Infrastruktur", // date: "2023-12-15", // author: "Tim Operasional PT Lenko", // image: "lenko.png" // } //]; // News pagination settings const NEWS_PER_PAGE = 6; let currentNewsPage = 1; // Load and display news function loadNews() { const newsGrid = document.getElementById('newsGrid'); const noResults = document.getElementById('noResults'); if (!newsGrid) return; // Calculate pagination const totalNews = newsData.length; const totalPages = Math.ceil(totalNews / NEWS_PER_PAGE); const startIndex = (currentNewsPage - 1) * NEWS_PER_PAGE; const endIndex = startIndex + NEWS_PER_PAGE; const currentNews = newsData.slice(startIndex, endIndex); // Clear grid newsGrid.innerHTML = ''; // Display news or no results if (currentNews.length === 0) { if (noResults) noResults.style.display = 'block'; newsGrid.style.display = 'none'; } else { if (noResults) noResults.style.display = 'none'; newsGrid.style.display = 'grid'; currentNews.forEach(news => { const newsCard = createNewsCard(news); newsGrid.appendChild(newsCard); }); } // Update pagination updateNewsPagination(totalPages); updateNewsPaginationInfo(startIndex + 1, Math.min(endIndex, totalNews), totalNews); } // Create news card element function createNewsCard(news) { const card = document.createElement('article'); card.className = 'news-card'; card.setAttribute('role', 'article'); const date = new Date(news.date); const formattedDate = date.toLocaleDateString('id-ID', { year: 'numeric', month: 'long', day: 'numeric' }); // Escape HTML to prevent XSS const escapeHtml = (text) => { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; }; const newsDetailUrl = `news/${news.slug}`; card.innerHTML = `
${escapeHtml(news.category)}

${escapeHtml(news.title)}

${escapeHtml(news.excerpt)}

${formattedDate} ${escapeHtml(news.author)}
`; return card; } // Update pagination function updateNewsPagination(totalPages) { const pagination = document.getElementById('pagination'); if (!pagination) return; pagination.innerHTML = ''; if (totalPages <= 1) return; // Previous button const prevBtn = document.createElement('button'); prevBtn.className = 'pagination-btn'; prevBtn.innerHTML = ''; prevBtn.disabled = currentNewsPage === 1; prevBtn.addEventListener('click', () => { if (currentNewsPage > 1) { currentNewsPage--; loadNews(); window.scrollTo({ top: 0, behavior: 'smooth' }); } }); pagination.appendChild(prevBtn); // Page numbers for (let i = 1; i <= totalPages; i++) { const pageBtn = document.createElement('button'); pageBtn.className = 'pagination-btn'; pageBtn.textContent = i; if (i === currentNewsPage) { pageBtn.classList.add('active'); } pageBtn.addEventListener('click', () => { currentNewsPage = i; loadNews(); window.scrollTo({ top: 0, behavior: 'smooth' }); }); pagination.appendChild(pageBtn); } // Next button const nextBtn = document.createElement('button'); nextBtn.className = 'pagination-btn'; nextBtn.innerHTML = ''; nextBtn.disabled = currentNewsPage === totalPages; nextBtn.addEventListener('click', () => { if (currentNewsPage < totalPages) { currentNewsPage++; loadNews(); window.scrollTo({ top: 0, behavior: 'smooth' }); } }); pagination.appendChild(nextBtn); } // Update pagination info function updateNewsPaginationInfo(start, end, total) { const paginationInfo = document.getElementById('paginationInfo'); if (!paginationInfo) return; paginationInfo.textContent = `Menampilkan ${start}-${end} dari ${total} berita`; }